package apis

import (
	"fmt"

	"gitee.com/sansaniot/ssiot-core/httpmvc/api"
	"gitee.com/sansaniot/ssiot-core/serrors"
	"github.com/gin-gonic/gin"
	"github.com/gin-gonic/gin/binding"

	"ssadmin/common/constant"
	"ssadmin/common/utils"
	"ssadmin/internal/admin/models"
	"ssadmin/internal/admin/models/command"
	"ssadmin/internal/admin/service"
)

type File struct {
	api.Api
}

// 上传文件
func (e File) UploadFile(c *gin.Context) {
	// 请求参数
	req := command.FileAddReq{}
	// 模型
	m := &models.Resource{}
	// 上下文
	err := e.MakeContext(c).
		MakeOrm().
		Bind(&req).
		MakeModel(&m.Model).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(serrors.Fail)
		return
	}
	if constant.FileUploadDiscard {
		e.Logger.Error("禁止文件上传, 已开启上传文件丢弃模式")
		e.Fail(0, "糟糕, 磁盘不够用了, 已开启上传文件丢弃模式")
		return
	}
	req.LoadUser(c)
	// 上传文件
	var fileInfos []utils.FileInfo
	httpFile := &utils.HttpFile{}
	filePath := fmt.Sprintf("%s/%s/%s", constant.FilePath, req.AgencyId, req.UserId)
	req.FilePath = utils.GetCommUtil().PathClear(req.FilePath)
	if len(req.FilePath) > 0 {
		filePath = fmt.Sprintf("%s/%s/%s/%s", constant.FilePath, req.FilePath, req.AgencyId, req.UserId)
	}
	if fileInfos, err = httpFile.UploadFile(c, filePath, req.Force); err != nil {
		e.Logger.Error(err)
		e.Fail(serrors.Fail)
		return
	}
	// 执行
	path := ""
	if path, err = m.AddResource(req.Generate(fileInfos), req.Force); err != nil {
		e.Logger.Error(err)
		e.Fail(serrors.Fail)
		return
	}
	// 返回
	e.Data(path)
}

// 删除文件
func (e File) DeleteFile(c *gin.Context) {
	// 请求参数
	req := command.FileDeleteReq{}
	// 模型
	itemModel := &models.Resource{}
	// 业务service
	s := &service.File{}
	// 上下文
	err := e.MakeContext(c).
		Bind(&req, binding.JSON).
		MakeModel(&itemModel.Model).
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(serrors.Fail)
		return
	}
	// service注入实体
	s.SetItemModel(itemModel)
	// 执行
	if err = s.DeleteFileItem(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(serrors.Fail)
		return
	}
	// 返回
	e.Ok(nil)
}
